#!/bin/bash
# 容器启动脚本：负责初始化MongoDB和显示环境信息

# 启用bash严格模式：遇到错误立即停止执行
# 这样可以避免脚本部分失败但继续执行导致的问题
set -e  

# 第一部分：准备MongoDB数据目录
# -----------------------------
# 确保MongoDB数据目录存在并具有正确的权限
echo "正在设置MongoDB数据目录权限..."
# 创建数据目录（如果不存在）
mkdir -p /data/db
# 赋予所有用户对数据目录的读写权限
# 777权限表示所有用户都可以读、写、执行
chmod -R 777 /data/db

# 第二部分：启动MongoDB服务
# -----------------------
echo "正在启动MongoDB服务..."
# 使用fork模式启动MongoDB（后台运行）
# 将日志输出到指定文件
mongod --fork --logpath /var/log/mongodb.log

# 第三部分：检查MongoDB服务状态
# --------------------------
echo "检查MongoDB服务状态..."
# 尝试最多10次连接MongoDB，每次间隔1秒
for i in {1..10}; do
  # 尝试执行简单命令检查连接
  # >/dev/null 2>&1 表示丢弃所有输出
  if mongosh --eval "db.version()" >/dev/null 2>&1; then
    echo "MongoDB服务已成功启动"
    break
  fi
  # 如果尝试10次后仍然失败，则报错并退出
  if [ $i -eq 10 ]; then
    echo "MongoDB服务启动失败，请检查日志: /var/log/mongodb.log"
    exit 1
  fi
  # 等待1秒后重试
  sleep 1
done

# 第四部分：创建MongoDB管理员用户
# ----------------------------
echo "正在创建MongoDB管理员用户..."
# 使用mongosh执行JavaScript代码创建用户
mongosh --eval "
  // 切换到admin数据库（系统管理数据库）
  db = db.getSiblingDB('admin');
  // 检查root用户是否已存在
  if (!db.getUser('root')) {
    // 创建具有root角色的管理员用户
    db.createUser({
      user: 'root',
      pwd: '123456',
      roles: [
        { role: 'root', db: 'admin' }
      ]
    });
    print('MongoDB管理员用户创建成功!');
  } else {
    print('MongoDB管理员用户已存在!');
  }
"
echo "MongoDB已启动，未启用身份验证模式，可直接访问"

# 第五部分：显示系统环境信息
# -----------------------
echo "开发环境已准备就绪！"
# 打印各种工具和组件的版本信息
echo "- Node.js 版本: $(node -v)"
echo "- npm 版本: $(npm -v)"
echo "- pnpm 版本: $(pnpm -v)"
echo "- TypeScript 版本: $(tsc -v)"
echo "- MongoDB 版本: $(mongod --version | grep db | head -n 1)"
echo "- MongoDB 管理员用户: root (密码: 123456)"
echo "- MongoDB 数据持久化: 通过容器挂载实现"

# 第六部分：提供MongoDB连接说明
# --------------------------
echo "您可以使用以下命令连接MongoDB:"
echo "  mongosh"
echo "  # 或使用管理员账户连接"
echo "  mongosh --authenticationDatabase admin -u root -p 123456"

# 第七部分：保持容器运行
# -------------------
# 执行传入的命令，如果没有命令或执行失败则使容器保持运行
# tail -f /dev/null 是一个不会自动结束的命令，用于保持容器活跃
exec "$@" || tail -f /dev/null 